package com.woniuxy.sddfp.access.service.impl;
import java.time.LocalDateTime;
import java.util.Date;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.woniuxy.sddfp.access.dto.BankReqDto;
import com.woniuxy.sddfp.access.entity.TradeLog;
import com.woniuxy.sddfp.access.mapper.TradeLogMapper;
import com.woniuxy.sddfp.access.service.ITradeLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.sddfp.common.model.BaseResult;
import com.woniuxy.sddfp.common.model.dto.bank.BankCardAddDTO;
import com.woniuxy.sddfp.common.model.dto.bank.SignatureDto;
import com.woniuxy.sddfp.common.model.dto.bid.BankBidDTO;
import com.woniuxy.sddfp.common.model.dto.bid.BidBalanceDTO;
import com.woniuxy.sddfp.common.model.vo.trade.BorrowSyncRecordVo;
import com.woniuxy.sddfp.common.utils.EncryptUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * <p>
 * 托管系统交易记录表 服务实现类
 * </p>
 *  1、tradeservice 的作用
 *         1、记录日志
 *         2、发送数据到 银行系统
 * @author yellow doctor
 * @since 2025-06-25
 *     我 ====》 让 唐家豪办事  ====》 叶春
 *                 1、记录日志
 *                       采购大米
 *                       2个西瓜
 *                 2、去粮油店
 *                       返回粮油
 *                    买2个西瓜
 *                        返回西瓜
 */
@Service
@Slf4j
public class TradeLogServiceImpl extends ServiceImpl<TradeLogMapper, TradeLog> implements ITradeLogService {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 绑卡操作
     * @param bankCardAddDTO
     * @return
     */
    @Override
    public SignatureDto proxyBindCardLog(BankCardAddDTO bankCardAddDTO) {

        //01 记录日志
        TradeLog tradeLog = new TradeLog();

        //请求流水号
        tradeLog.setReqCode(bankCardAddDTO.getReqCode());
        //给一个默认字符串
        tradeLog.setReqType("USER_BIND_CARD");

        //业务表示 给 userId
        tradeLog.setObjectId(bankCardAddDTO.getUserId());

        //创建时间
        tradeLog.setCreateDate(LocalDateTime.now());
        tradeLog.setConfirmDate(LocalDateTime.now()); //确认时间

        //数据同步  银行返回数据 你才操作
//        tradeLog.setSynchronizeStatus(0);
        //银行返回的数据
//        tradeLog.setResponseData("");

        save(tradeLog);


        //02 发送数据到银行系统
        System.out.println("模拟发送数据到银行....");

        SignatureDto signatureDto = new SignatureDto();
        signatureDto.setBankUrl("http://www.zhongguobank.com");
        signatureDto.setPlatformNo("中国银行");
        signatureDto.setReqData("{\"msg\":\"成功\",\"code\":\"100000\"}");
        signatureDto.setReqCode(bankCardAddDTO.getReqCode());

        signatureDto.setReqCode(bankCardAddDTO.getReqCode());

        return signatureDto;
    }

    /**
     * 借款记录审核，同步数据
     * 1、保存交易日志，此时数据同步状态SynchronizeStatus值默认是0
     *      trade_log
     *
     * 2、远程调用【银行托管系统】 RestTemplate
     *       http://localhost:5600/.........
     *
     * 3、根据远程调用结果，修改trade_log表的同步状态为1
     */
    @Override
    public BaseResult syncBorrowRecord(BorrowSyncRecordVo borrowSyncRecordVo) {
        //1、保存交易日志，此时数据同步状态SynchronizeStatus值默认是0
        TradeLog tradeLog = new TradeLog();
        // 设置请求流水号
        tradeLog.setReqCode(borrowSyncRecordVo.getReqCode());
        // 设置交易类型：SYNC表示数据同步操作
        tradeLog.setReqType("SYNC");
        // 设置对象唯一id，也就是业务主键
        tradeLog.setObjectId(borrowSyncRecordVo.getId());
        // 设置创建时间
        tradeLog.setCreateDate(LocalDateTime.now());
        // 设置同步状态：0未同步； 当调用银行托管系统成功返回后改为1已同步
        tradeLog.setSynchronizeStatus(0);
        // 保存交易日志
        this.save(tradeLog);

        //2、远程调用托管系统

        //2.3 请求数据 - 对象转换为JSON， 使用alibaba提供的fastjson工具类(银行托管也是使用fastjson)
        String str = JSON.toJSONString(borrowSyncRecordVo);
        //2.4 对象加密处理： str ---> Base64编码 ---> URL编码 ---> 目标str
        // str ---> Base64编码
        String base64Str = EncryptUtil.encodeUTF8StringBase64(str);
        // Base64编码 ---> URL编码
        String reqData = EncryptUtil.encodeURL(base64Str);
        // url:  /service    serviceName= xxx服务(SYNC_BORROW_RECODE)
        String url = "http://localhost:5600/service?serviceName=SYNC_BORROW_RECORD&reqData=" + reqData;
        log.info("发送数据的url:{}",url);

        // 银行系统使用的是 @RestController 把对象都转成 json 字符串
        String respBody = restTemplate.getForObject(url, String.class);
        log.info("银行系统返回的数据:{}",respBody);
        // {"respData":{"respCode":"00000","respMsg":"成功","status":1,"requestNo":"REQ_208f14ff-b"}}
        BankReqDto bankReqDto = JSON.parseObject(respBody, BankReqDto.class);
        //拿到字符串解析
        BaseResult baseResult = JSON.parseObject(bankReqDto.getRespData(), BaseResult.class);
        log.info("银行系统返回的数据进行解析:{}",baseResult);
        String respMsg = baseResult.getRespMsg();
        if (respMsg.equals("成功")){
            //更新日志  更新  status、ResponseData
            update(
                    Wrappers.lambdaUpdate(TradeLog.class)
                            .set(TradeLog::getSynchronizeStatus,1)
                            .set(TradeLog::getResponseData,respBody)   // 银行响应的数据
                            .set(TradeLog::getConfirmDate,new Date())
                            .eq(TradeLog::getId,tradeLog.getId())
            );
        }
        return baseResult;
    }





    @Override
    public BidBalanceDTO getBidBalance(String userCode) {
        String requestUrl = "http://localhost:5600/bid/balance/" + userCode;
        BidBalanceDTO balanceDetailsDTO =
                restTemplate.getForObject(requestUrl, BidBalanceDTO.class);
        return balanceDetailsDTO;
    }

    @Override
    public BaseResult bankBidService(BankBidDTO bankBidDTO) {
        TradeLog tradeLog = new TradeLog();
        tradeLog.setReqCode(bankBidDTO.getReqCode());
        tradeLog.setObjectId(bankBidDTO.getId());
        tradeLog.setReqType(bankBidDTO.getBizType());
        tradeLog.setCreateDate(LocalDateTime.now());
        tradeLog.setSynchronizeStatus(0);
        // 保存交易日志
        this.save(tradeLog);

        String jsonString=JSON.toJSONString(bankBidDTO);
        String base64Str = EncryptUtil.encodeUTF8StringBase64(jsonString);
        String reqData = EncryptUtil.encodeURL(base64Str);

        // 往银行托管系统发送借款数据,根据结果修改状态并返回结果
        //String url="http://localhost:5600/service";
        //BaseResult baseResult = sendHttpGet(
        //        "AGENCY_BID", url, reqData, tradeLog);

        String url = "http://localhost:5600/service?serviceName=AGENCY_BID&reqData=" + reqData;
        log.info("发送数据的url:{}",url);

        String respBody = restTemplate.getForObject(url, String.class);
        log.info("银行系统返回的数据:{}",respBody);
        BankReqDto bankReqDto = JSON.parseObject(respBody, BankReqDto.class);
        BaseResult baseResult = JSON.parseObject(bankReqDto.getRespData(), BaseResult.class);

        String respMsg = baseResult.getRespMsg();
        if (respMsg.equals("成功")){
            //更新日志  更新  status、ResponseData
            update(
                    Wrappers.lambdaUpdate(TradeLog.class)
                            .set(TradeLog::getSynchronizeStatus,1)
                            .set(TradeLog::getResponseData,respBody)   // 银行响应的数据
                            .set(TradeLog::getConfirmDate,new Date())
                            .eq(TradeLog::getId,tradeLog.getId())
            );
        }
        return baseResult;
    }






}
